{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 第二步：调整树的参数：max_depth & min_child_weight\n",
    "(粗调，参数的步长为2；下一步是在粗调最佳参数周围，将步长降为1，进行精细调整)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "# path to where the data lies\n",
    "dpath = './'\n",
    "train = pd.read_csv(dpath +\"RentListingInquries_FE_train.csv\")\n",
    "#train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(49352, 227)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y_train = train['interest_level']\n",
    "X_train = np.array(train.drop([\"interest_level\"], axis=1))\n",
    "X_train.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 训练"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "各类样本不均衡，交叉验证是采用StratifiedKFold，在每折采样时各类样本按比例采样"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第一轮参数调整得到的n_estimators最优值（320），其余参数继续默认值"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "用交叉验证评价模型性能时，用scoring参数定义评价指标。评价指标是越高越好，因此用一些损失函数当评价指标时，需要再加负号，如neg_log_loss，neg_mean_squared_error 详见sklearn文档：http://scikit-learn.org/stable/modules/model_evaluation.html#log-loss"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': range(3, 10, 2), 'min_child_weight': range(1, 6, 2)}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#max_depth 建议3-10， min_child_weight=1／sqrt(ratio_rare_event) =5.5\n",
    "max_depth = range(3,10,2)\n",
    "min_child_weight = range(1,6,2)\n",
    "param_test2_1 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/zhangwt/.local/lib/python3.6/site-packages/sklearn/model_selection/_search.py:762: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.59626, std: 0.00323, params: {'max_depth': 3, 'min_child_weight': 1},\n",
       "  mean: -0.59599, std: 0.00344, params: {'max_depth': 3, 'min_child_weight': 3},\n",
       "  mean: -0.59602, std: 0.00327, params: {'max_depth': 3, 'min_child_weight': 5},\n",
       "  mean: -0.58827, std: 0.00400, params: {'max_depth': 5, 'min_child_weight': 1},\n",
       "  mean: -0.58815, std: 0.00391, params: {'max_depth': 5, 'min_child_weight': 3},\n",
       "  mean: -0.58785, std: 0.00329, params: {'max_depth': 5, 'min_child_weight': 5},\n",
       "  mean: -0.59452, std: 0.00531, params: {'max_depth': 7, 'min_child_weight': 1},\n",
       "  mean: -0.59252, std: 0.00520, params: {'max_depth': 7, 'min_child_weight': 3},\n",
       "  mean: -0.59170, std: 0.00435, params: {'max_depth': 7, 'min_child_weight': 5},\n",
       "  mean: -0.61749, std: 0.00615, params: {'max_depth': 9, 'min_child_weight': 1},\n",
       "  mean: -0.60826, std: 0.00419, params: {'max_depth': 9, 'min_child_weight': 3},\n",
       "  mean: -0.60424, std: 0.00385, params: {'max_depth': 9, 'min_child_weight': 5}],\n",
       " {'max_depth': 5, 'min_child_weight': 5},\n",
       " -0.5878464973732851)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb2_1 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=320,  #第一轮参数调整得到的n_estimators最优值\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch2_1 = GridSearchCV(xgb2_1, param_grid = param_test2_1, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch2_1.fit(X_train , y_train)\n",
    "\n",
    "gsearch2_1.grid_scores_, gsearch2_1.best_params_,     gsearch2_1.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/zhangwt/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/zhangwt/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/zhangwt/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/zhangwt/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/zhangwt/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/zhangwt/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/zhangwt/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([104.27389665, 103.04759774, 101.45300303, 162.20039344,\n",
       "        162.3706039 , 162.33700113, 227.91388836, 226.74732175,\n",
       "        224.67042718, 292.31820302, 288.41299453, 280.36857009]),\n",
       " 'std_fit_time': array([1.02452449, 0.93751395, 0.65974193, 0.43231797, 0.60691901,\n",
       "        0.60025131, 0.27323733, 0.68924621, 0.98193558, 1.42718505,\n",
       "        0.39458569, 5.67242049]),\n",
       " 'mean_score_time': array([0.52405796, 0.47169166, 0.40749531, 0.80587559, 0.78999481,\n",
       "        0.78187037, 1.45252175, 1.42790828, 1.24602075, 2.53325973,\n",
       "        2.20664277, 1.79829564]),\n",
       " 'std_score_time': array([0.06174116, 0.05898024, 0.01804584, 0.06418171, 0.05296375,\n",
       "        0.05005534, 0.18716388, 0.17699986, 0.09639656, 0.13381174,\n",
       "        0.13151927, 0.21138062]),\n",
       " 'param_max_depth': masked_array(data=[3, 3, 3, 5, 5, 5, 7, 7, 7, 9, 9, 9],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'param_min_child_weight': masked_array(data=[1, 3, 5, 1, 3, 5, 1, 3, 5, 1, 3, 5],\n",
       "              mask=[False, False, False, False, False, False, False, False,\n",
       "                    False, False, False, False],\n",
       "        fill_value='?',\n",
       "             dtype=object),\n",
       " 'params': [{'max_depth': 3, 'min_child_weight': 1},\n",
       "  {'max_depth': 3, 'min_child_weight': 3},\n",
       "  {'max_depth': 3, 'min_child_weight': 5},\n",
       "  {'max_depth': 5, 'min_child_weight': 1},\n",
       "  {'max_depth': 5, 'min_child_weight': 3},\n",
       "  {'max_depth': 5, 'min_child_weight': 5},\n",
       "  {'max_depth': 7, 'min_child_weight': 1},\n",
       "  {'max_depth': 7, 'min_child_weight': 3},\n",
       "  {'max_depth': 7, 'min_child_weight': 5},\n",
       "  {'max_depth': 9, 'min_child_weight': 1},\n",
       "  {'max_depth': 9, 'min_child_weight': 3},\n",
       "  {'max_depth': 9, 'min_child_weight': 5}],\n",
       " 'split0_test_score': array([-0.59106837, -0.589975  , -0.59086356, -0.58108595, -0.5820684 ,\n",
       "        -0.58231336, -0.58651821, -0.58269357, -0.58463414, -0.60614947,\n",
       "        -0.60254376, -0.59818122]),\n",
       " 'split1_test_score': array([-0.59485574, -0.59462881, -0.59411912, -0.58715698, -0.58510894,\n",
       "        -0.58607033, -0.59338137, -0.59256495, -0.59018258, -0.61677805,\n",
       "        -0.60402539, -0.6038113 ]),\n",
       " 'split2_test_score': array([-0.59615675, -0.5970138 , -0.5962962 , -0.58944272, -0.58994882,\n",
       "        -0.58967146, -0.59337226, -0.59454022, -0.59200883, -0.61876266,\n",
       "        -0.61003838, -0.60408496]),\n",
       " 'split3_test_score': array([-0.60024136, -0.59936565, -0.59929744, -0.5913537 , -0.59145752,\n",
       "        -0.58962784, -0.59642134, -0.59485884, -0.59381923, -0.62244614,\n",
       "        -0.61191807, -0.60477822]),\n",
       " 'split4_test_score': array([-0.5989645 , -0.59894654, -0.59952672, -0.59230353, -0.59216839,\n",
       "        -0.59155063, -0.60291924, -0.59792012, -0.59785886, -0.623315  ,\n",
       "        -0.61277978, -0.6103266 ]),\n",
       " 'mean_test_score': array([-0.59625718, -0.59598578, -0.59602039, -0.58826833, -0.58815017,\n",
       "        -0.5878465 , -0.59452197, -0.59251521, -0.59170035, -0.61748991,\n",
       "        -0.6082608 , -0.60423609]),\n",
       " 'std_test_score': array([0.00322807, 0.00344146, 0.00326548, 0.00400008, 0.00391296,\n",
       "        0.00328615, 0.00530645, 0.0052014 , 0.00435296, 0.0061519 ,\n",
       "        0.00418519, 0.00385347]),\n",
       " 'rank_test_score': array([ 9,  7,  8,  3,  2,  1,  6,  5,  4, 12, 11, 10], dtype=int32),\n",
       " 'split0_train_score': array([-0.56661019, -0.5678699 , -0.56814106, -0.48627883, -0.49369667,\n",
       "        -0.49864089, -0.35829757, -0.38565948, -0.40207407, -0.2212077 ,\n",
       "        -0.27276168, -0.30382317]),\n",
       " 'split1_train_score': array([-0.56592944, -0.56712765, -0.56755316, -0.48405709, -0.49125595,\n",
       "        -0.49710124, -0.35726848, -0.38305219, -0.40028212, -0.22246733,\n",
       "        -0.27401037, -0.30386553]),\n",
       " 'split2_train_score': array([-0.56490298, -0.5659604 , -0.56642018, -0.48377823, -0.49135948,\n",
       "        -0.4965518 , -0.35681575, -0.38241151, -0.39998245, -0.21922422,\n",
       "        -0.27201229, -0.30579425]),\n",
       " 'split3_train_score': array([-0.56427517, -0.5654097 , -0.56620305, -0.48534261, -0.49187686,\n",
       "        -0.49630661, -0.35714489, -0.3822797 , -0.39985108, -0.21976974,\n",
       "        -0.27132442, -0.30160272]),\n",
       " 'split4_train_score': array([-0.56397274, -0.56489533, -0.56615249, -0.48208857, -0.48982995,\n",
       "        -0.49516487, -0.35837743, -0.38255551, -0.40096004, -0.21885169,\n",
       "        -0.271316  , -0.30477918]),\n",
       " 'mean_train_score': array([-0.56513811, -0.5662526 , -0.56689399, -0.48430907, -0.49160378,\n",
       "        -0.49675308, -0.35758082, -0.38319168, -0.40062995, -0.22030414,\n",
       "        -0.27228495, -0.30397297]),\n",
       " 'std_train_score': array([0.00099512, 0.00109721, 0.00080516, 0.00142997, 0.00124755,\n",
       "        0.00113554, 0.0006358 , 0.00126132, 0.00081748, 0.0013459 ,\n",
       "        0.00101392, 0.00138702])}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gsearch2_1.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.587846 using {'max_depth': 5, 'min_child_weight': 5}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/zhangwt/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/zhangwt/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/zhangwt/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/zhangwt/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/zhangwt/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/zhangwt/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/home/zhangwt/.local/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAELCAYAAADz6wBxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAIABJREFUeJzt3Xl8VNX5+PHPM5OdBAJZlE1AFkHZChFFFAGLgiiKYAhWq9alX6w/a20RtVaKtS5fvlVcqK1a9yIBFEWLLCqKSy0CBdkh4kIAIYSEPSHL8/tjboZJmCSTTCaThOf9es0rd+4999xnbhienHPvPUdUFWOMMaa2XOEOwBhjTONmicQYY0xQLJEYY4wJiiUSY4wxQbFEYowxJiiWSIwxxgTFEokxxpigWCIxxhgTFEskxhhjghIR7gDqQ3Jysnbs2DHcYRhjTKOycuXKvaqaUl25kyKRdOzYkRUrVoQ7DGOMaVRE5PtAylnXljHGmKBYIjHGGBMUSyTGGGOCclJcIzHGBK6oqIjs7GwKCgrCHYqpJzExMbRr147IyMha7W+JxBhTTnZ2NgkJCXTs2BERCXc4JsRUldzcXLKzs+nUqVOt6rCuLWNMOQUFBSQlJVkSOUmICElJSUG1QC2RGGNOYEnk5BLs79u6tqpwcOlSxOWi2fnnI253uMMxxpgGyRJJFfa99DJHli8nok1rWqan0+Kqq4hMTQ13WMYY06BY11YVTnvhedpOn05Uhw7kTH+SrGEXkX3Hrzn0+edoaWm4wzOmScrPz+evf/1rrfadPn06R44cqeOI6saQIUNqPcLG22+/zYYNG2pUV0FBAQMGDKBPnz6cddZZTJkypVbHDoQlkipIVBTNR1xCh5deovPC92n1859zZPlytt90M9+MGEnuCy9QvG9fuMM0pklpqokkGBUTSSCio6P56KOPWLNmDatXr2bhwoV8+eWXIYnPurYCFNWxI6fcPYmUX9/BwcVLyM/MZM///YWcJ58iYfhwEjPGE3f22XaR0jQpU99dz4adB+q0zjPbNGfK5WdVuv2ee+7hm2++oW/fvgwfPpzU1FRmz55NYWEhY8aMYerUqRw+fJj09HSys7MpKSnhD3/4A7t372bnzp0MHTqU5ORkli5d6rf++Ph4Jk6cyIIFC2jdujUPP/wwd999Nz/88APTp09n9OjRfPfdd1x33XUcPnwYgGeeeYbzzjuPefPm8cwzz/DBBx/w448/cuGFF7Js2TJOPfXUE45z9OhRbrzxRtasWUP37t05evSod9vixYuZMmUKhYWFdO7cmZdeeon4+Hg6duxIeno677//PrGxscycOZM9e/Ywf/58PvnkEx566CHefPNNAObMmcNtt91Gfn4+//jHP7jgggvKHV9EiI+PBzzPBhUVFYXs/ydrkdSQKzqaFpdfRofXX+P0994lMSODQ599xg8/v55toy5j3yuvUJKfH+4wjWm0Hn30UTp37szq1asZPnw4W7duZfny5axevZqVK1eybNkyFi5cSJs2bVizZg3r1q1jxIgR3HHHHbRp04alS5dWmkQADh8+zLBhw1i/fj0JCQncf//9LFmyhHnz5vHAAw8AkJqaypIlS1i1ahWZmZnccccdAIwZM4bWrVszY8YMbrnlFqZOneo3iQA8++yzxMXFsXHjRqZOncrKlSsB2Lt3Lw899BAffPABq1atIi0tjccff9y7X4sWLVi7di233347d955J+eddx6jR49m2rRprF69ms6dOwNQXFzM8uXLmT59OlOnTgVg586dXHrppd66SkpK6Nu3L6mpqQwfPpxzzjkniN9M5axFEoToLl049ff3kXrXbzjw/kLyMzPZ/cij7Hn8CZqPGEFixnhi+/a1VopptKpqOdSHxYsXs3jxYn7yk58AcOjQIbZu3coFF1zAb3/7WyZPnsxll112wl/jVYmKimLEiBEA9OrVi+joaCIjI+nVqxffffcd4PkL/vbbb2f16tW43W62bNni3f/pp5+mZ8+enHvuuUyYMKHS4yxbtsybgHr37k3v3r0B+PLLL9mwYQODBg0C4NixYwwcONC7X1mdEyZM4De/+U2l9V911VUA9O/f3xt3mzZtWLBggbeM2+1m9erV5OfnM2bMGNatW0fPnj0DOk81YYmkDrhiY0m8agyJV42hYNMm8jIzOTD/Xfa/8w7R3bqRmDGeFpdfjjshIdyhGtOoqCr33nsvv/zlL0/YtmrVKhYsWMD999/PRRdd5G1NVCcyMtL7x53L5SI6Otq7XFxcDMATTzzBKaecwpo1aygtLSUmJsa7f3Z2Ni6Xi927d1NaWorLVbOOHVVl+PDhvPHGG363+/7hWdUfoWVxu91ub9yVSUxMZOjQoSxcuDAk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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# summarize results\n",
    "print(\"Best: %f using %s\" % (gsearch2_1.best_score_, gsearch2_1.best_params_))\n",
    "test_means = gsearch2_1.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch2_1.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch2_1.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch2_1.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch2_1.cv_results_).to_csv('my_preds_maxdepth_min_child_weights_1.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(max_depth), len(min_child_weight))\n",
    "train_scores = np.array(train_means).reshape(len(max_depth), len(min_child_weight))\n",
    "\n",
    "for i, value in enumerate(max_depth):\n",
    "    pyplot.plot(min_child_weight, -test_scores[i], label= 'test_max_depth:'   + str(value))\n",
    "#for i, value in enumerate(min_child_weight):\n",
    "#    pyplot.plot(max_depth, train_scores[i], label= 'train_min_child_weight:'   + str(value))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'max_depth' )                                                                                                      \n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig('max_depth_vs_min_child_weght_1.png' )"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
